'use strict'
//map
let m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); //手写一个Map
console.log(m.get('Michael')); // 95

//初始化Map需要一个二维数组，或者直接初始化一个空Map
let n = new Map(); //空Map
n.set('Adam',67); //增
n.set('Adam',87); //修
n.set('Bob',59);
n.has('Adam'); // 是否存在key 'Adam': true
console.log(n.get('Adam')); //87 查
n.delete('Adam');
console.log(n.get('Adam')); //undefined

//Set
//Set和Map类似，也是一组key的集合，但不存储value。由于key不能重复，所以，在Set中，没有重复的key。
//要创建一个Set，需要提供一个Array作为输入，或者直接创建一个空Set
let s1 = new Set(); //空set
let s2 = new Set([1,2,3]);

//重复元素在Set中自动被过滤
let s3 = new Set([1, 2, 3, 3, '3']);
console.log(s3);
//增 通过add(key)方法可以添加元素到Set中
s3.add(4);

//删 通过delete(key)方法可以删除元素
s3.delete(2);

//iterable
/*
* 遍历Array可以采用下标循环，遍历Map和Set就无法使用下标。
* 为了统一集合类型，ES6标准引入了新的iterable类型，Array、Map和Set都属于iterable类型。
* 具有iterable类型的集合可以通过新的for ... of循环来遍历。
* */
let a = ['A', 'B', 'C'];
let b = new Set(['A', 'B', 'C']);
let c = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);

for (let x of a){
    console.log(x);
}
for (let x of b){
    console.log(x);
}
for (let x of c){
    console.log(x[0] + '==>' + x[1]);
}

//更好的方式是直接使用iterable内置的forEach方法，它接收一个函数，每次迭代就自动回调该函数
let d = ['A','B','C'];
d.forEach(function (element,index,array) {
    //element:指向当前元素的值
    //index:指向当前索引
    //array：指向Array对象本身
    console.log(`${element},index = ${index}`);
    console.log(array);
})

//Set与Array类似，但Set没有索引，因此回调函数的前两个参数都是元素本身